﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace l1cs.server.utils
{
    public class BinaryOutputStream
    {//: OutputStream {
        private String CLIENT_LANGUAGE_CODE = Config.CLIENT_LANGUAGE_CODE;

        //private final ByteArrayOutputStream _bao = new ByteArrayOutputStream();
        private List<byte> _bao = new List<byte>();

        public BinaryOutputStream()
        {
        }

        //@Override
        public void write( int b )
        {
            _bao.Add( (byte)b );
        }

        public void writeD( int value )
        {
            _bao.Add( (byte)( value & 0xff ) );
            _bao.Add( (byte)( value >> 8 & 0xff ) );
            _bao.Add( (byte)( value >> 16 & 0xff ) );
            _bao.Add( (byte)( value >> 24 & 0xff ) );
        }

        public void writeH( int value )
        {
            _bao.Add( (byte)( value & 0xff ) );
            _bao.Add( (byte)( value >> 8 & 0xff ) );
        }

        public void writeC( int value )
        {
            _bao.Add( (byte)( value & 0xff ) );
        }

        public void writeP( int value )
        {
            _bao.Add( (byte)( value ) );
        }

        public void writeL( long value )
        {
            _bao.Add( (byte)( (int)( value & 0xff ) ) );
        }

        //public void writeF( double org )
        //{
        //    long value = Double.doubleToRawLongBits( org );
        //    _bao.write( (int)( value & 0xff ) );
        //    _bao.write( (int)( value >> 8 & 0xff ) );
        //    _bao.write( (int)( value >> 16 & 0xff ) );
        //    _bao.write( (int)( value >> 24 & 0xff ) );
        //    _bao.write( (int)( value >> 32 & 0xff ) );
        //    _bao.write( (int)( value >> 40 & 0xff ) );
        //    _bao.write( (int)( value >> 48 & 0xff ) );
        //    _bao.write( (int)( value >> 56 & 0xff ) );
        //}

        public void writeS( String text )
        {
            if ( text != null )
            {
                //_bao.write( text.getBytes( CLIENT_LANGUAGE_CODE ) );
                foreach ( byte data in Encoding.GetEncoding( CLIENT_LANGUAGE_CODE ).GetBytes( text ) )
                {
                    _bao.Add( data );
                }
            }

            _bao.Add( 0 );
        }

        public void writeByte( byte[] text )
        {
            if ( text != null )
            {
                //_bao.write( text );
                foreach ( byte data in text )
                {
                    _bao.Add( data );
                }
            }
        }

        public int getLength()
        {
            return _bao.Count + 2;
        }

        public byte[] getBytes()
        {
            return _bao.ToArray();
        }
    }

}
